package com.satan.juc.demo24;

import java.util.concurrent.atomic.AtomicLong;
import java.util.function.LongUnaryOperator;
import java.util.function.LongBinaryOperator;

public class AtomicLongExample {
    public static void main(String[] args) {
        // 创建一个新的AtomicLong，默认初始值为0
        AtomicLong atomicLong = new AtomicLong();

        // 获取当前值
        long currentValue = atomicLong.get();

        // 设置给定值
        atomicLong.set(123L);

        // 获取当前值，并设置新的值
        long oldValue = atomicLong.getAndSet(456L);

        // 如果当前值等于预期值，则以原子方式将该值设置为给定的更新值
        boolean wasUpdated = atomicLong.compareAndSet(456L, 789L);

        // 以原子方式将给定值添加到当前值
        long newSum = atomicLong.addAndGet(300L);

        // 获取当前值，并以原子方式将给定值添加到它
        long previousValue = atomicLong.getAndAdd(300L);

        // 以原子方式递增当前值
        long incrementedValue = atomicLong.incrementAndGet();

        // 获取当前值，并以原子方式递增
        long prevIncrementedValue = atomicLong.getAndIncrement();

        // 以原子方式递减当前值
        long decrementedValue = atomicLong.decrementAndGet();

        // 获取当前值，并以原子方式递减
        long prevDecrementedValue = atomicLong.getAndDecrement();

        // 使用给定函数以原子方式更新当前值，并返回更新后的值
        LongUnaryOperator updateFunction = x -> x * 2;
        long updatedValue = atomicLong.updateAndGet(updateFunction);

        // 获取当前值，并使用给定函数以原子方式更新它
        long prevUpdatedValue = atomicLong.getAndUpdate(updateFunction);

        // 使用给定函数和给定值以原子方式累加当前值，并返回累加后的值
        LongBinaryOperator accumulatorFunction = (x, y) -> x + y;
        long accumulatedValue = atomicLong.accumulateAndGet(500L, accumulatorFunction);

        // 获取当前值，并使用给定函数和给定值以原子方式累加它
        long prevAccumulatedValue = atomicLong.getAndAccumulate(500L, accumulatorFunction);
    }
}
